WOLF core
WOLF: A Modular Estimation Framework for Robotics
XXXXXXXXXXXXXXXXXXXXXXXXvoid(0)" frameborder="0" name="MSearchResults" id="MSearchResults">
solver_manager.h
Go to the documentation of this file.
1// WOLF - Copyright (C) 2020-2026
2// Institut de Robòtica i Informàtica Industrial, CSIC-UPC.
3// Authors: Joan Solà Ortega (jsola@iri.upc.edu) and
4// Joan Vallvé Navarro (jvallve@iri.upc.edu)
5// All rights reserved.
6//
7// This file is part of WOLF: http://www.iri.upc.edu/wolf
8// WOLF is free software: you can redistribute it and/or modify
9// it under the terms of the GNU General Public License version 3
10// as published by the Free Software Foundation.
11//
12// This program is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU General Public License
18// along with this program. If not, see <http://www.gnu.org/licenses/>.
19#pragma once
20
21// wolf includes
22#include "core/common/wolf.h"
27
28namespace wolf
29{
30WOLF_PTR_TYPEDEFS(SolverManager)
31
32/*
33 * Macro for defining Autoconf solver creator for WOLF's high level API.
34 *
35 * Place a call to this macro inside your class declaration (in the solver_class.h file),
36 * preferably just after the constructors. Inside 'public' keyword.
37 *
38 * In order to use this macro, the derived solver manager class, SolverClass,
39 * must have a constructor available with the API:
40 *
41 * SolverClass(const ProblemPtr& wolf_problem,
42 * const YAML::Node _params);
43 *
44 * Also, there should be the schema file 'SolverClass.schema' containing the specifications
45 * of the user input yaml file.
46 *
47 * NOTE: We use `new` and not `make_shared` since the constructor may (should) be private/protected
48 */
49#define WOLF_SOLVER_CREATE(SolverClass) \
50 static SolverManagerPtr create(const ProblemPtr& _problem, \
51 const YAML::Node& _input_node, \
52 const std::vector<std::string>& _folders_schema = {}) \
53 { \
54 if (not _folders_schema.empty()) \
55 { \
56 auto server = yaml_schema_cpp::YamlServer(_folders_schema); \
57 server.setYaml(_input_node); \
58 if (not server.applySchema(#SolverClass)) \
59 { \
60 WOLF_ERROR(server.getLog()); \
61 return nullptr; \
62 } \
63 return std::shared_ptr<SolverClass>(new SolverClass(_problem, server.getNode())); \
64 } \
65 return std::shared_ptr<SolverClass>(new SolverClass(_problem, _input_node)); \
66 } \
67 static SolverManagerPtr create(const ProblemPtr& _problem, \
68 const std::string& _yaml_filepath, \
69 const std::vector<std::string>& _folders_schema) \
70 { \
71 auto server = yaml_schema_cpp::YamlServer(_folders_schema, _yaml_filepath); \
72 if (not server.applySchema(#SolverClass)) \
73 { \
74 WOLF_ERROR(server.getLog()); \
75 return nullptr; \
76 } \
77 return create(_problem, server.getNode(), {}); \
78 }
79
84{
85 public:
88 enum class CovarianceBlocksToBeComputed : std::size_t
89 {
90 ALL = 0,
91 ALL_MARGINALS = 1,
92 ROBOT_LANDMARKS = 2,
94 GAUSS = 3,
95 GAUSS_TUCAN = 4,
96 GAUSS_TUCAN_ONLY_POSITION = 5
97 };
98
101 enum class ReportVerbosity : std::size_t
102 {
103 QUIET = 0,
104 BRIEF = 1,
105 FULL = 2
106 };
107
108 // PROFILING
109 void printProfiling(std::ostream& stream = std::cout) const;
110 const ProfilingUnit& getProfilingTotal() const;
111 const ProfilingUnit& getProfilingSolve() const;
112 const ProfilingUnit& getProfilingUpdate() const;
113 const ProfilingUnit& getProfilingState() const;
114 const ProfilingUnit& getProfilingCov() const;
115
116 protected:
117 ProblemPtr wolf_problem_;
119 YAML::Node params_;
120
121 private:
122 std::thread solver_thread_;
123
124 public:
128 SolverManager(const ProblemPtr& _problem);
132 SolverManager(const ProblemPtr& _problem, const YAML::Node& _params);
133
134 static SolverManagerPtr autoSetup(const ProblemPtr& _problem,
135 const std::string& _input_yaml_file,
136 std::vector<std::string> _primary_schema_folders,
137 bool _skip_yaml_validation = false);
138
139 static SolverManagerPtr autoSetup(const ProblemPtr& _problem,
140 YAML::Node _param_node,
141 std::vector<std::string> _primary_schema_folders,
142 bool _skip_yaml_validation = false);
143
144 virtual ~SolverManager();
145
149 std::string solve();
153 std::string solve(const ReportVerbosity report_level);
154
155 virtual bool computeCovariances() final;
156
157 virtual bool computeCovariances(const CovarianceBlocksToBeComputed blocks) final;
158
159 virtual bool computeCovariances(const std::vector<StateBlockPtr>& st_list) final;
160
164 virtual void update();
165
166 ProblemPtr getProblem();
167
168 YAML::Node getParams() const;
169
170 bool getComputeCov() const;
171
172 double getPeriod() const;
173
174 double getCovPeriod() const;
175
177
178 virtual bool isStateBlockRegistered(const StateBlockPtr& state_ptr) const final;
179
180 virtual bool isStateBlockFloating(const StateBlockPtr& state_ptr) const final;
181
182 virtual bool isStateBlockFixed(const StateBlockPtr& st) const final;
183
184 virtual bool isFactorRegistered(const FactorBasePtr& fac_ptr) const final;
185
186 virtual bool hasThisLocalParametrization(const StateBlockPtr& st,
187 const LocalParametrizationBasePtr& local_param) const final;
188
189 virtual bool hasLocalParametrization(const StateBlockPtr& st) const final;
190
191 virtual int numFactors() const final;
192 virtual int sizeFactors() const final;
193 virtual int numStateBlocks() const final;
194 virtual int sizeStateBlocks() const final;
195 virtual int numStateBlocksEstimated() const final;
196 virtual int sizeStateBlocksEstimated() const final;
197
198 virtual int numFactorsDerived() const = 0;
199 virtual int sizeFactorsDerived() const = 0;
200 virtual int numStateBlocksEstimatedDerived() const = 0;
201 virtual int sizeStateBlocksEstimatedDerived() const = 0;
202
203 virtual bool check(std::string prefix = "") const final;
204
205 protected:
206 std::map<StateBlockPtr, Eigen::VectorXd> state_blocks_;
207 std::map<StateBlockPtr, FactorBasePtrList> state_blocks_2_factors_;
208 std::set<FactorBasePtr> factors_;
209 std::set<StateBlockPtr> floating_state_blocks_;
210
211 virtual Eigen::VectorXd& getAssociatedMemBlock(const StateBlockPtr& state_ptr);
212 const double* getAssociatedMemBlockPtr(const StateBlockPtr& state_ptr) const;
213 double* getAssociatedMemBlockPtr(const StateBlockPtr& state_ptr);
214
215 private:
216 // SolverManager functions
217 virtual void addFactor(const FactorBasePtr& fac_ptr) final;
218 virtual void removeFactor(const FactorBasePtr& fac_ptr) final;
219 virtual void addStateBlock(const StateBlockPtr& state_ptr) final;
220 virtual void removeStateBlock(const StateBlockPtr& state_ptr) final;
221 virtual void updateStateBlockState(const StateBlockPtr& state_ptr) final;
222 virtual void updateStateBlockStatus(const StateBlockPtr& state_ptr) final;
223 virtual void updateStateBlockLocalParametrization(const StateBlockPtr& state_ptr) final;
224
225 // Pure virtual functions to be derived
226 protected:
227 virtual std::string solveDerived(const ReportVerbosity report_level) = 0;
229 virtual bool computeCovariancesDerived(const std::vector<StateBlockPtr>& st_list) = 0;
230
231 virtual void addFactorDerived(const FactorBasePtr& fac_ptr) = 0;
232 virtual void removeFactorDerived(const FactorBasePtr& fac_ptr) = 0;
233 virtual void addStateBlockDerived(const StateBlockPtr& state_ptr) = 0;
234 virtual void removeStateBlockDerived(const StateBlockPtr& state_ptr) = 0;
235 virtual void updateStateBlockStatusDerived(const StateBlockPtr& state_ptr) = 0;
236 virtual void updateStateBlockLocalParametrizationDerived(const StateBlockPtr& state_ptr) = 0;
237
238 virtual bool isStateBlockRegisteredDerived(const StateBlockPtr& state_ptr) const = 0;
239 virtual bool isFactorRegisteredDerived(const FactorBasePtr& fac_ptr) const = 0;
240 virtual bool isStateBlockFixedDerived(const StateBlockPtr& st) const = 0;
241 virtual bool hasLocalParametrizationDerived(const StateBlockPtr& st) const = 0;
242 virtual bool hasThisLocalParametrizationDerived(const StateBlockPtr& st,
243 const LocalParametrizationBasePtr& local_param) const = 0;
244
245 virtual void printProfilingDerived(std::ostream& stream = std::cout) const = 0;
246 virtual bool checkDerived(std::string prefix = "") const = 0;
247
248 public:
249 virtual bool converged() const = 0;
250 virtual bool failed() const = 0;
251 virtual bool wasStopped() const = 0;
252 virtual unsigned int iterations() const = 0;
253 virtual double initialCost() const = 0;
254 virtual double finalCost() const = 0;
255 virtual double totalTime() const = 0;
256
257 virtual void run() final;
258 virtual void stop() final;
259
260 private:
261 virtual void loop();
262
263 protected:
264 // PARAMS
265 double period_;
270 std::chrono::high_resolution_clock::time_point last_cov_time_;
272};
273
274} // namespace wolf
Definition: profiling_unit.h:30
Solver manager for WOLF.
Definition: solver_manager.h:84
virtual int numStateBlocksEstimated() const final
Definition: solver_manager.cpp:608
ProfilingUnit profiling_cov_
Definition: solver_manager.h:118
virtual bool hasLocalParametrization(const StateBlockPtr &st) const final
Definition: solver_manager.cpp:573
ProblemPtr wolf_problem_
Definition: solver_manager.h:117
virtual void stop() final
Definition: solver_manager.cpp:655
ProfilingUnit profiling_total_
Definition: solver_manager.h:118
virtual int sizeFactorsDerived() const =0
virtual void updateStateBlockStatusDerived(const StateBlockPtr &state_ptr)=0
virtual int sizeStateBlocksEstimatedDerived() const =0
CovarianceBlocksToBeComputed
Enumeration of covariance blocks to be computed.
Definition: solver_manager.h:89
virtual bool isFactorRegisteredDerived(const FactorBasePtr &fac_ptr) const =0
std::set< StateBlockPtr > floating_state_blocks_
Definition: solver_manager.h:209
virtual Eigen::VectorXd & getAssociatedMemBlock(const StateBlockPtr &state_ptr)
Definition: solver_manager.cpp:497
ProfilingUnit profiling_state_
Definition: solver_manager.h:118
ProfilingUnit profiling_update_
Definition: solver_manager.h:118
virtual bool check(std::string prefix="") const final
Definition: solver_manager.cpp:718
YAML::Node getParams() const
Definition: solver_manager.cpp:624
virtual double initialCost() const =0
ReportVerbosity getVerbosity() const
Definition: solver_manager.cpp:533
virtual void run() final
Definition: solver_manager.cpp:644
std::chrono::high_resolution_clock::time_point last_cov_time_
Definition: solver_manager.h:270
const double * getAssociatedMemBlockPtr(const StateBlockPtr &state_ptr) const
Definition: solver_manager.cpp:509
std::map< StateBlockPtr, FactorBasePtrList > state_blocks_2_factors_
Definition: solver_manager.h:207
virtual void updateStateBlockLocalParametrizationDerived(const StateBlockPtr &state_ptr)=0
virtual double finalCost() const =0
virtual bool checkDerived(std::string prefix="") const =0
double getPeriod() const
Definition: solver_manager.cpp:629
CovarianceBlocksToBeComputed cov_enum_
Definition: solver_manager.h:268
virtual int sizeFactors() const final
Definition: solver_manager.cpp:587
bool compute_cov_
Definition: solver_manager.h:267
virtual unsigned int iterations() const =0
static SolverManagerPtr autoSetup(const ProblemPtr &_problem, const std::string &_input_yaml_file, std::vector< std::string > _primary_schema_folders, bool _skip_yaml_validation=false)
Definition: solver_manager.cpp:50
double getCovPeriod() const
Definition: solver_manager.cpp:634
virtual int numFactors() const final
Definition: solver_manager.cpp:582
virtual int numStateBlocks() const final
Definition: solver_manager.cpp:594
virtual int sizeStateBlocksEstimated() const final
Definition: solver_manager.cpp:616
const ProfilingUnit & getProfilingUpdate() const
Definition: solver_manager.cpp:873
const ProfilingUnit & getProfilingTotal() const
Definition: solver_manager.cpp:863
virtual bool hasLocalParametrizationDerived(const StateBlockPtr &st) const =0
bool stopping_
Definition: solver_manager.h:271
virtual void addStateBlockDerived(const StateBlockPtr &state_ptr)=0
virtual int numFactorsDerived() const =0
virtual bool failed() const =0
const ProfilingUnit & getProfilingCov() const
Definition: solver_manager.cpp:883
SolverManager(const ProblemPtr &_problem)
Constructor with default params_.
virtual bool computeCovariances() final
Definition: solver_manager.cpp:271
std::map< StateBlockPtr, Eigen::VectorXd > state_blocks_
Definition: solver_manager.h:206
virtual bool hasThisLocalParametrizationDerived(const StateBlockPtr &st, const LocalParametrizationBasePtr &local_param) const =0
virtual bool isStateBlockRegistered(const StateBlockPtr &state_ptr) const final
Definition: solver_manager.cpp:538
virtual bool isStateBlockFixedDerived(const StateBlockPtr &st) const =0
YAML::Node params_
Definition: solver_manager.h:119
bool getComputeCov() const
Definition: solver_manager.cpp:639
std::string solve()
Solves with the verbosity defined in params_.
Definition: solver_manager.cpp:229
virtual int sizeStateBlocks() const final
Definition: solver_manager.cpp:599
virtual double totalTime() const =0
ProblemPtr getProblem()
Definition: solver_manager.cpp:224
virtual bool isStateBlockFixed(const StateBlockPtr &st) const final
Definition: solver_manager.cpp:554
double cov_period_
Definition: solver_manager.h:269
virtual bool isFactorRegistered(const FactorBasePtr &fac_ptr) const final
Definition: solver_manager.cpp:549
virtual bool isStateBlockRegisteredDerived(const StateBlockPtr &state_ptr) const =0
const ProfilingUnit & getProfilingSolve() const
Definition: solver_manager.cpp:868
virtual void removeStateBlockDerived(const StateBlockPtr &state_ptr)=0
ProfilingUnit profiling_solve_
Definition: solver_manager.h:118
virtual void update()
Updates solver's problem according to the wolf_problem.
Definition: solver_manager.cpp:121
void printProfiling(std::ostream &stream=std::cout) const
Definition: solver_manager.cpp:888
virtual int numStateBlocksEstimatedDerived() const =0
ReportVerbosity verbose_
Definition: solver_manager.h:266
virtual bool isStateBlockFloating(const StateBlockPtr &state_ptr) const final
Definition: solver_manager.cpp:544
virtual void printProfilingDerived(std::ostream &stream=std::cout) const =0
virtual ~SolverManager()
Definition: solver_manager.cpp:48
std::set< FactorBasePtr > factors_
Definition: solver_manager.h:208
virtual bool hasThisLocalParametrization(const StateBlockPtr &st, const LocalParametrizationBasePtr &local_param) const final
Definition: solver_manager.cpp:563
virtual bool computeCovariancesDerived(const CovarianceBlocksToBeComputed blocks)=0
virtual bool converged() const =0
virtual bool wasStopped() const =0
virtual void addFactorDerived(const FactorBasePtr &fac_ptr)=0
double period_
Definition: solver_manager.h:265
virtual std::string solveDerived(const ReportVerbosity report_level)=0
virtual void removeFactorDerived(const FactorBasePtr &fac_ptr)=0
const ProfilingUnit & getProfilingState() const
Definition: solver_manager.cpp:878
ReportVerbosity
Enumeration for the verbosity of the solver report.
Definition: solver_manager.h:102
Namespace extending Eigen definitions.
Definition: wolf.h:94
Definition: composite.h:225
Definition: jet.h:1355
Definition: capture_base.h:23
WOLF_PTR_TYPEDEFS(CaptureLandmarksExternal)